package bancosys.tec.security.authorization;

import java.io.Serializable;
import java.util.Collections;
import java.util.Set;

/**
 * @created 25/03/2008
 * @author Gustavo Almeida
 */
public class ChineseWallPermission extends AbstractPermission implements Serializable {

    private static final long serialVersionUID = 1L;

    private final String entityName;
    
    private final Set<Long> entityIds;

    private final boolean fullAccess;

    private final long credentialId;

    /**
     * Construtor.
     * 
     * @param permissionId nome da permissao
     * @param entityName nome da entidade.
     * @param entityIds ids das entidades.
     * @param credentialId id da credential
     */
    public ChineseWallPermission(String permissionId, String entityName, Set<Long> entityIds, long credentialId) {
        this(permissionId, entityName, entityIds, false, credentialId);
    }

    /**
     * Cria uma permissao com full access
     * 
     * @param permissionId nome da permissao
     * @param entityName String
     * @return {@link ChineseWallPermission}
     */
    public static ChineseWallPermission createFullAccess(String permissionId, String entityName) {
        return new ChineseWallPermission(permissionId, entityName, Collections.<Long> emptySet(), true, 0L);
    }

    /**
     * Construtor.
     * 
     * @param permissionId nome da permissao
     * @param entityName nome da entidade.
     * @param entityIds ids das entidades.
     * @param fullAccess true se permissão deve se aplicar a todas as entidades, false caso contrário.
     * @param credentialId long
     */
    private ChineseWallPermission(String permissionId, String entityName, Set<Long> entityIds, boolean fullAccess, long credentialId) {
        if (entityName == null) {
            throw new NullPointerException("Nome da entidade deve ser informado.");
        }
        this.id = permissionId;
        this.entityName = entityName;
        this.entityIds = entityIds;
        this.fullAccess = fullAccess;
        this.credentialId = credentialId;
        this.type = ChineseWallPermission.class;
    }

    /**
     * Testa se o id da permissão usando o nome da entidade.
     * 
     * @param permissionId id a ser testado.
     * @return devolve <code>true</code> se o permissionId for igual ao nome da entidade, <code>false</code> caso contrário.
     */
    @Override
    protected boolean matchPermissionId(String permissionId) {
        return this.id.equals(permissionId);
    }

    /**
     * Devolve os ids das entidades.
     * 
     * @return os ids das entidades.
     */
    public Set<Long> getEntityIds() {
        return this.entityIds;
    }

    /**
     * Returns true if this credential should grant permission to access ALL entities.
     * 
     * @return the all
     */
    public boolean isFullAccess() {
        return fullAccess;
    }

    /**
     * Devolve a representação string dessa entidade.
     * 
     * @return a representação string dessa entidade.
     */
    @Override
    public String toString() {
        return "ChineseWallEntityPermission(entityName: " + this.id + "; ids: " + (this.fullAccess ? " * " : this.entityIds) + ")";
    }

    /**
     * @return the credentialId
     */
    public long getCredentialId() {
        return credentialId;
    }

    /**
     * @return the entityName
     */
    public String getEntityName() {
        return entityName;
    }

}
